package com.zhouyiquan.qqclient.service;

import com.zhouyiquan.qqcommon.Message;
import com.zhouyiquan.qqcommon.MessageType;
import com.zhouyiquan.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Author: 周益全 (https://gitee.com/zfovikqdev928)
 * @BugFeedBackEmail: zfovikqdev928@126.com
 * @Date: Create in 2023-01
 * @Description: 该类完成用户验证、用户注册等功能
 * @Version:
 */
public class UserClientService {

    private final User user = new User();

    private Socket socket;

    /**
     * 根据 userId、passwd 到服务器验证用户是否合法
     *
     * @param userId
     * @param passwd
     * @return
     */
    public boolean checkUser(String userId, String passwd) {
        boolean status = false;
        user.setUserId(userId);
        user.setPasswd(passwd);

        // 连接服务端发送对象
        try {
            // 9999 服务器端监听端口
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);

            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(user); // 发送对象至服务端

            // 服务器端检验后，会给服务器回复 Message
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message ms = (Message) ois.readObject();

            // 登录成功
            if (ms.getMessageType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
                // 开启一个线程维护 ->  ClientConnectServerThread 类
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket);
                ccst.start();
                // 为了客户端的扩展，将线程放入集合中管理
                ManageClientConnectServerThread.addClientConnectServerThread(userId, ccst);
                status = true;
            } else {
                // 登陆失败，不能启动线程与服务器通信，但需要关闭 socket
                socket.close();
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }

    /**
     * 1
     * 向服务器端请求在线用户列表
     */
    public void onlineFriendList() {
        Message message = new Message();
        message.setMessageType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setSender(user.getUserId());
        try {
            // 从线程集合中获取当前线程 socket 所对应的 ObjectOutputStream 对象，发送 Message
            ClientConnectServerThread userIdThread = ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId());
            ObjectOutputStream oos = new ObjectOutputStream(userIdThread.getSocket().getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 9 客户端退出系统，并给服务器端发送退出指令
     */
    public void logout() {
        Message message = new Message();
        message.setMessageType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(user.getUserId()); // 指定需要退出的客户端

        try {
            ObjectOutputStream oos = new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId()).getSocket().getOutputStream());
            oos.writeObject(message);
            System.out.println(user.getUserId() + "退出系统...");
            System.exit(0); // 结束进程
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
